home *** CD-ROM | disk | FTP | other *** search
- INCLUDE \ASM\INCLUDE\BIOS.INC
- INCLUDE DEFS.INC
-
- MSG_OFFS EQU 66 ; position of message text in buffer
- BIOS_SEG EQU 0040h ; seg address of BIOS data area
- KBD_HEAD EQU 01Ah ; offset of keyboard head ptr
- KBD_TAIL EQU 01Ch ; offset of keyboard tail ptr
- MEM_FLAG EQU 072h ; POST flag for rebooting
-
- LOGOUT_SERVICE EQU 80h
- RUN_SERVICE EQU 81h
- REBOOT_SERVICE EQU 82h
-
- msv SEGMENT
- ASSUME CS:msv
- ASSUME DS:msv
- ASSUME ES:msv
- ASSUME SS:NOTHING
- ORG 0
- SEG_ORG EQU $
- ORG 100h
- main PROC FAR
- start: jmp init ; Do initialization section
-
- ;*******************************************************************
- ; LANOS VECTOR TSR portion of Resident Extensions
- ; The LANOS portion simply sets a message received flag and
- ; exits, leaving the actual processing of the message to an
- ; interrupt.
- ;*******************************************************************
- MSV_entry: jmp first ; skip data area
- msg_flag db 0
- kbd_busy db 0 ; still stuffin' that buffer
- kbd_index dw 0 ; current position in string
- msg_state db 0 ; storage for old msg flag
- msg_address dd ? ; message address data
- old_msr dd ?
- old_vector2 dd ? ; old DOS service vector
-
- old_stk_seg dw ? ; Calling program's stack info
- old_b_ptr dw ?
- old_stk_ptr dw ?
- new_stk_seg dw ?
- new_stk_ptr dw OFFSET TOS
- dw 60 dup (?) ; local stack data area
- TOS equ $
-
- ;************************************************************************
- ; Start of actual LANOS message handler. This message handler should
- ; be loaded last.
- ;************************************************************************
- first:
- push ax ; save the regs we're gonna use
- mov word ptr cs:msg_address,bx ; save address of incoming message
- mov word ptr cs:msg_address + 2,es
-
- mov al,es:[bx]+1 ; get the MB_type field
- cmp al,80h ; is it for us?
- jl END_MSH ; if less than 80h it's not ours
-
- mov cs:msg_flag,al ; save the message type.
- pop ax ; restore ax
- iret ; back to originally scheduled program
-
- END_MSH:
- pop ax ; restore AX register
- jmp cs:old_msr ; call everyone else...
-
- ;*****************************************************************************
- ; Interrupt E0 handler --- this is apparently something that LANtastic uses
- ; internally to indicate when DOS is safe.
- ;*****************************************************************************
- INT_E0 DD 0
- DOSFREE:
- PUSHF
- CALL CS:old_vector2 ; give everyone else a chance...
-
- push ax ; save the regs we're using
- push dx
- mov al,cs:msg_flag ; get message flag
-
- cmp al,0 ; have our services been requested?
- jz Done_E0 ; If not, skip this stuff
-
- CHK_LOGOUT:
- cmp al,LOGOUT_SERVICE ; is it a logout request?
- jne CHK_RUN ; if not, continue
-
- call logout ; execute the logout
- mov cs:msg_flag,0 ; reset the message flag
- jmp Done_E0 ; all done.
-
- CHK_RUN:
- cmp al,RUN_SERVICE ; is it a remote RUN request?
- jne CHK_REBOOT
-
- cmp cs:kbd_busy,0 ; are we already stuffing the buffer?
- jnz DO_RUN
-
- inc cs:kbd_busy ; set the busy flag
- mov cs:kbd_index,66 ; set our string pointer to the text.
-
- DO_RUN:
- ; Note -- stuff_buffer is responsible for clearing msg_flag and kbd_busy when
- ; it has stuffed all the characters into the buffer and added a carriage
- ; return
-
- call stuff_buffer ; Enter a character into der buffer.
- jmp Done_E0
-
- CHK_REBOOT:
- cmp al,REBOOT_SERVICE ; is it a reboot request?
- jne Done_E0 ; if it's not for us, continue
-
- ; reboot der computer now!
- mov ax,BIOS_SEG
- mov ds,ax
- mov ax,1234h
- mov WORD PTR ds:[MEM_FLAG],ax ; set keyboard reboot flag
- pushf ; set up for hard reboot
- mov ax,0FFFFh
- push ax
- xor ax,ax
- push ax
- retf
-
- Done_E0:
- pop dx
- pop ax
- iret
-
- ;*****************************************************************************
- ; Logs the computer out of the specified server
- ;*****************************************************************************
- logout PROC near
- push di
- push ax
- push es
-
- mov di,word ptr cs:msg_address ; put server name in ES:DI
- add di,MSG_OFFS ; point to message text
- mov ax,word ptr cs:msg_address+2
- mov es,ax
-
- mov ax,5F82h ; log out of the server
- int 21h ; do it!
-
- pop es
- pop ax
- pop di
-
- ret
- logout ENDP
-
- ;*****************************************************************************
- ; Stuffs the specified command in the keyboard buffer, one key at a time.
- ;
- ;*****************************************************************************
- Stuff_Buffer PROC near
- @NewStack
- cli ; forbid interrupts
-
- ; Point DS to our command string buffer
- mov ax,word ptr cs:msg_address+2 ; point data segment to msg buffer
- mov ds,ax
-
- mov si,word ptr cs:msg_address
- add si,cs:kbd_index ; get our offset
-
- mov al,byte ptr ds:[si] ; get the next character
-
- cmp al,0 ; is it the terminator
- jnz Start_Stuff ; if not, continue
-
- mov cs:kbd_busy,0 ; clear keyboard busy flag
- mov cs:msg_flag,0 ; clear message flag
- mov al,13 ; convert char to return
-
- ; point ES to the BIOS data area
- Start_Stuff:
- mov bx, BIOS_SEG
- mov es, bx
-
- mov bx, word ptr es:[KBD_TAIL] ; is anything in the buffer?
- cmp bx, word ptr es:[KBD_HEAD]
- jnz Done_Stuff ; if so, then don't do anything
-
- inc cs:kbd_index ; point to the next char
-
- mov es:[bx],ax ; save the keystroke
- inc bx
- inc bx ; move the tail pointer
- cmp bx,3Eh ; check for buffer wrap
- jl Set_Kbd_Ptrs ; have we wrapped?
- mov bx,1Eh ; if so, back to start of buffer
- Set_Kbd_Ptrs:
- mov word ptr es:[KBD_TAIL],bx ; set the keyboard buffer ptr.
-
- Done_Stuff:
- @OldStack
- ret
- Stuff_Buffer ENDP
-
- LAST_BYTE EQU $
-
- ;
- ; Initialization -- thrown away after load
- ;
-
- ;*********************************************************************
- ; Subroutines
- ;********************************************************************
- PRT_STR PROC NEAR
- ;
- ; Write ASCIIZ string pointed to by ES:DI at current cursor position
- ;
- L3:
- mov al,es:[di] ; get the character
- or al,al ; See if it's a zero
- jz L4 ; Yes- we're done
- mov bx,7 ; display page 0, fg color 7
- mov ah,0Eh ; Write char / tty mode
- int 10h ; Display the character
- inc di ; get the next char
- jmp short L3
- L4:
- ret
- PRT_STR ENDP
-
-
-
- title1 db " SoftMagic Resident Extension Module V1.0 for LANtastic",13,10,0
- title2 db "Copyright 1990 by SoftMagic, Inc. All rights Reserved.",13,10,0
- title3 db " LANtastic is a trademark of Artisoft, Inc.",13,10,0
-
- IFDEF SHAREWARE
- title5 db 7,"Thanks for trying this unregistered ShareWare Version!",7,7,13,10,0
- ENDIF
-
- init:
- @NewStack ; Set up local stack
- push cs
- pop es
-
- ; Display title messge
- mov di,OFFSET title1
- call PRT_STR
- mov di,OFFSET title2
- call PRT_STR
- mov di,OFFSET title3
- call PRT_STR
-
- IFDEF SHAREWARE
- mov di,OFFSET title5
- call PRT_STR
- ENDIF
-
- ; Get old LANOS message handler vector
- mov ax,5FE2h
- int 21h
- mov word ptr old_msr,bx ; Save the location of the old vector
- mov word ptr old_msr+2,es
-
- ;
- ; Replace the LANOS message service
- ;
- mov ax,cs
- mov es,ax
- mov ax,5FE3h
- mov bx,OFFSET MSV_entry
- int 21H
-
- ;
- ; Replace LANtastic's internal DOS free vector
- ;
- MOV AX,5FE0H
- INT 21H ; GET THE DOS FREE VECTOR
- MOV WORD PTR old_vector2,BX
- MOV WORD PTR old_vector2+2,ES
-
- ;
- ; Set vector to our routine
- ;
- push cs
- pop es
- MOV BX,OFFSET DOSFREE
- MOV AX,5FE1H
- INT 21H
-
- ; Terminate and stay resident
- @OldStack ; Restore caller's stack
- mov dx,(offset LAST_BYTE - SEG_ORG + 15) shr 4
- mov ah,31h ; free memory and leave
- int 21h
- main ENDP
- msv ENDS
- END start
-